use std::sync::Arc;
use tokio::sync::Mutex as TokioMutex;
use once_cell::sync::Lazy;
use sqlx::sqlite::SqlitePool;
use lazy_static::lazy_static;
use tokio::runtime::Runtime;
use log::error;

// 全局 Tokio Runtime
pub static RUNTIME: Lazy<Runtime> = Lazy::new(|| {
    tokio::runtime::Builder::new_multi_thread()
        .enable_all()
        .worker_threads(4)  // 设置工作线程数，可以根据需要调整
        .thread_name("ai-trade-async-runtime")
        .build()
        .expect("Failed to create global Tokio runtime")
});

pub mod compute;
pub mod config;
pub mod controller;
pub mod data;
pub mod models;
pub mod service;
pub mod utils;

// 重新导出常用类型
pub use compute::indicators::AdvancedIndicatorCalculator;
pub use compute::memory::{MemoryPool, MemoryPoolConfig};
pub use compute::parallel::DataPipeline;

// 全局 PyO3Bridge 实例
 
// 全局数据库连接池
pub static GLOBAL_POOL: Lazy<Arc<SqlitePool>> = Lazy::new(|| {
    // 获取可执行文件所在目录
    let exe_dir = std::env::current_exe()
        .unwrap_or_else(|_| std::path::PathBuf::from("."))
        .parent()
        .unwrap_or_else(|| std::path::Path::new("."))
        .to_path_buf();

    // 根据环境确定数据库路径
    let database_path = if cfg!(debug_assertions) 
    {
        // 开发环境：使用项目根目录
        std::env::current_dir()
            .unwrap_or_else(|_| std::path::PathBuf::from("../../"))
            .join("database")
            .join("ai_trade.db")
             
    } else {
        // 生产环境：使用可执行文件目录
        exe_dir.join("database").join("ai_trade.db")
          
    };
    

    // 确保数据库目录存在
    if let Some(db_dir) = database_path.parent() {
        std::fs::create_dir_all(db_dir)
            .expect("Failed to create database directory");
    }

    // 构建数据库URL
    let database_url = if cfg!(debug_assertions) {
        format!("sqlite:{}", "D:/AI-Trade/database/ai_trade.db")
    } else {
        format!("sqlite:{}", database_path.to_string_lossy())
    };
    println!("Database URL: {}", database_url);
    // 使用全局 Runtime 连接数据库
    let pool = RUNTIME.block_on(async {
        SqlitePool::connect(&database_url)
            .await
            .expect("Failed to create database pool")
    });
    Arc::new(pool)
});